/**
 * @particulars 全局api 处理，挂载到Vue 上的静态方法
 */

import { mergeOptions } from "./utils";


export function initGlobalAPI(Vue) {
  // 在Vue.options 上挂载一个_base 属性，便于调用Vue 的静态方法
  Vue.options = { _base: Vue };

  // 将用户的选项和全局的options 进行合并
  Vue.mixin = function (mixin) {
    this.options = mergeOptions(this.options, mixin);
    return this;
  }

  // 根据用户传递的参数，返回一个子类构造函数
  Vue.extend = function (options) {
    // 子类
    function Sub(options = {}) {
      this._init(options);
    }

    // 复用原型，使用create 会导致构造函数的constructor 指向父类，Sub.prototype__proto__ = Vue.prototype
    Sub.prototype = Object.create(Vue.prototype);
    Sub.prototype.constructor = Sub;
    // 保存用户的选项，和全局的选项进行合并
    Sub.options = mergeOptions(Vue.options, options);

    return Sub;
  }

  // 收集全局定义的组件
  Vue.options.components = {};
  Vue.component = function (componentName, definition) {
    // 用户定义的组件，如果不是函数形式的，默认会调用Vue.extend 去创建
    definition = typeof definition === 'function' ? definition : Vue.extend(definition);
    Vue.options.components[componentName] = definition;
  }
}